# pddnsc

Возможно `DDNS` клиент

## Запуск

~~~sh
python -m pddnsc.cli
~~~

либо в [docker](https://www.docker.com)/[podman](https://podman.io) (для запуска по расписанию в `cron`):

~~~bash
docker run -v .state:/app/state:rw \
           -v .settings:/app/settings:ro \
           -e SCHEDULE=@hourly \
           gitea.b4tman.ru/b4tman/pddnsc
~~~

## Конфигурация

Конфигурация находится в файле `settings/config.toml`.
Пример конфигурации:

~~~toml
[sources]
  # сервис https://www.ipify.org
  [sources.ipfy]
    provider = "IPIFYSource" # имя python класса

[filters]
  # этот фильтр означает, что если ip адреса не изменились (по хешу)
  # то не нужно никуда отсылать ничего
  [filters.state-hash]
    provider = "StateHashFilter"
    filepath = "state/hash.txt"

[outputs]
  # сохранение хеша всех ip адресов в файл,
  # чтобы потом проверить изменились ли они
  [outputs.hash-file]
    provider = "StateHashFile"
    filepath = "state/hash.txt"

  # сервис доменов на vscale (vds.selectel.ru)
  # токен в переменной окружения VSCALE_API_TOKEN
  [outputs.vscale]
    provider = "VscaleDomains"
    domain = "example.com"
    target = "www" # изменяем www.example.com
    ttl = 3600
    ipv4 = true # менять A запись
    ipv6 = false # НЕ менять AAAA запись
~~~

Конфигурация состоит из секций:

- `sources` - источники ip адресов (выбирается результат от первого по времени сработавшего источника, который вернул хотябы один ipv4 или ipv6 адрес)
- `filters` - фильтры, если хоть один вернет ложь то программа ничего никуда не запишет и не отправит, например проверка, что ip адрес не изменился
- `outputs` - модули вывода, например вывод в консоль, запись в файл или создание dns записей на сервере

Все модули источников/фильтров/вывода работают конкурентно через [asyncio](https://docs.python.org/3/library/asyncio.html#module-asyncio) и [httpx](https://www.python-httpx.org).

### Подробная документация

Её необходимо собрать с помошью [mkdocs](https://www.mkdocs.org). Для этого нужно установить зависимости:

~~~bash
pip install -r requirements.txt
pip install -r requirements.docs.txt
~~~

После этого либо собрать документацию в каталог `site/`, либо запустить тестовый сервер.

~~~bash
# сборка
mkdocs build
# тестовый сервер
mkdocs serve
~~~
